Active Model
其實還有個可供擴充的 module ,在使用它之後,就可以加上像是
before_validation
after_validation
的 callbacks 囉!
為您介紹:ActiveModel::Validations::Callbacks
For example:
class MyClass
include ActiveModel::Model
include ActiveModel::Validations::Callbacks
# 加上他之後,就會多出 validation 的 callback 可用
attr_accessor :email
before_validation :handle_email
# 有些時候在執行 validation 前需要確保某些方法有被觸發過,比如 email 驗證前想確保他是字串或是降小寫之類。
validates_presence_of :email
# 依照執行順序撰寫會比較易讀
after_validation :do_something, if: -> { errors.blank? }
# 在 validation 之後如果想要判斷是否 valid 需要用 errors 有沒有 message 來判斷,萬一用到 `.valid?` 就會再執行一次 validation、再再執行一次,演變成 stack level too deep。
def handle_email
@email = '' unless @email.is_a? String
@email = @email.downcase
end
def do_something
# ....
end
end
當然,要在 validation 前後埋什麼 callbacks,具體還得要看您的 form object 怎麼規劃。